package com.alatus;

public class Rasterizer {
//    设置屏幕分辨率
    public static final int screen_w = Rect.screen_W;
    public static final int screen_h = Rect.screen_H;
    public static int half_screen_w = Rect.half_screen_W;
    public static int half_screen_h = Rect.half_screen_H;
//    屏幕的像素组
    public static int[] screen = Rect.screen;
//    视角的原点到屏幕的距离(以像素为单位)这个值越大视角就越狭窄,常用的值为屏幕的一半
    public static int screenDistance = screen_w/2;
//    用两个矢量数组来表示三角形的顶点坐标和变化后的顶点坐标
//    未经变换的三角形顶点
    public static Vector3D[] triangleVertices;
//    变化后的三角形顶点坐标
    public static Vector3D[] updatedVertices;
//    三角形的顶点个数,一般为3,但但三角形与视角z平面相切的时候有可能是4个
    public static int vertexCount = 3;
//    三角形变换后的顶点投影在屏幕上的2D坐标
    public static float[][] vertices2D = new float[4][2];
//    用于扫描三角形的两个数组,每行由两个值,分别表示描线的起点和终点的X坐标
    public static int[] xleft = new int[screen_h],xRight = new int[screen_h];
//    三角形扫描线最高和最低的位置
    public static int scanUpperPosition,scanLowerPosition;
//    三角形的颜色
    public static int triangleColor;
//    三角形的s形
    public static int renderType;
//    初始化光栅渲染器
    public static void init() {
//        初始化三角形变换后的顶点
        updatedVertices = new Vector3D[]{
                new Vector3D(0,0,0),
                new Vector3D(0,0,0),
                new Vector3D(0,0,0),
                new Vector3D(0,0,0),
        };
    }
//    光栅渲染器的入口
    public static void rasterizer(){
//        变换三角形的顶点
        transformVertices();
//        将三角形转为扫描线
        scanTriangle();
//        给三角形像素着色
        renderTriangle();
    }
//    变换三角形的顶点
    public static void transformVertices(){
//        当前演示是静态渲染的三角形,以此不做变换
        updatedVertices[0].set(triangleVertices[0]);
        updatedVertices[1].set(triangleVertices[1]);
        updatedVertices[2].set(triangleVertices[2]);
//        用投影公式求出顶点在屏幕上的2D坐标
        for (int i = 0; i < vertexCount; i++) {
            vertices2D[i][0] = half_screen_w + updatedVertices[i].x*screenDistance/updatedVertices[i].z;
            vertices2D[i][1] = half_screen_h - updatedVertices[i].y*screenDistance/updatedVertices[i].z;
        }
    }
//    将三角形转换为扫描线
    public static void scanTriangle(){

    }
}
